package com.slj.uitil;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;


@Data
@Schema()//是 Swagger/OpenAPI 注解，用于在自动生成的 API 文档中定义类或字段的名称、描述和结构，让接口文档更清晰易懂。
public class S<T> {
    //描述统一的格式
    @Schema(description = "描述统一的格式")
    private T data;

    //状态码 可简化为0表示成功,1表示失败
    @Schema(description = "状态码")
    private Integer code;

    //描述统一格式中的消息，可选属性
    @Schema(description = "描述统一格式中的消息，可选属性")
    private String message;

    //信息状态
    private Boolean status;

    //自定义有返回结果集的
    private static  <T> S<T> response(Integer code, String message, Boolean status, T data){
        S<T> s = new S<>();
        s.setCode(code);
        s.setMessage(message);
        s.setStatus(status);
        s.setData(data);
        return s;
    }

    //自定义没有返回结果集的
    private static  <T> S<T> response(Integer code, String message, Boolean status){
        S<T> s = new S<>();
        s.setCode(code);
        s.setMessage(message);
        s.setStatus(status);
        return s;
    }

    //成功返回，无返回结果
    public static <T> S<T> success() {
        return response(HttpEnum.SUCCESS.getCode(), HttpEnum.SUCCESS.getMessage(), true);
    }

    //成功返回，有返回结果
    public static <T> S<T> success(T data) {
        return response(HttpEnum.SUCCESS.getCode(), HttpEnum.SUCCESS.getMessage(), true, data);
    }

    //失败返回
    public static <T> S<T> fail() {
        return response(HttpEnum.ERROR.getCode(), HttpEnum.ERROR.getMessage(), false);
    }

    //失败返回
    public static <T> S<T> fail(Integer code, String message) {
        return response(code, message, false);
    }

    /**
     * 未登录返回结果
     */
    public static <T> S<T> unauthorized() {
        return response(HttpEnum.UNAUTHORIZED.getCode(),HttpEnum.UNAUTHORIZED.getMessage() , false);
    }

    /**
     * 未授权返回结果
     */
    public static <T> S<T> forbidden() {
        return response(HttpEnum.FORBIDDEN.getCode(), HttpEnum.FORBIDDEN.getMessage(), false);
    }
}
